/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.reporte.accion;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import org.reporte.control.AbstractFacade;
import org.reporte.control.Conexion;
import org.reporte.modelo.UsuarioModuloReporte;
import org.reporte.utils.EncriptadorSHA;
import org.reporte.utils.JsfAyuda;

/**
 *
 * @author 43579648
 */
@ManagedBean
@SessionScoped
public class SesionUsuario extends AbstractFacade<UsuarioModuloReporte> {

    
    private String usuario;
    private String contrasena;
    
    
    /** Creates a new instance of SesionUsuario */
    public SesionUsuario() {
        super(UsuarioModuloReporte.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return Conexion.getEntityManager();
    }
    
    //Primer login insert into APP.USUARIO_MODULO_REPORTE (id_usuario,contrasena,seudonimo) values(1,'3ZRwlSi7HIPQjzCI1AQ/R0KJH08=','admin');
    public String validarUsuarioIngresar() throws Exception{
        setEntity(obtenerUsuarioIngresaSesion());
        if(getEntity()==null){
            JsfAyuda.lanzarMensajeAdvertencia(JsfAyuda.getPropertyValue("usuarioManagedBeanAutentificacionInvalida"));
        }else{
            JsfAyuda.lanzarMensajeInfo(JsfAyuda.getPropertyValue("usuarioManagedBeanAutentificacionCorrecta") + getEntity().getSeudonimo());
        }
        return "/principal/Inicio";
    }
    
    public boolean isUsuarioEnSesion(){
        return getEntity()!=null;
    }
    
    public String desconectarSesion(){
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext externalContext = context.getExternalContext();
        Object session = externalContext.getSession(false);
        HttpSession httpSession = (HttpSession) session;
        httpSession.invalidate(); 
        JsfAyuda.lanzarMensajeInfo(JsfAyuda.getPropertyValue("usuarioManagedBeanCerrarSesion"));
        return "/principal/Inicio";
    }
    
    
    private UsuarioModuloReporte obtenerUsuarioIngresaSesion() throws Exception{
        try{
            String jpql = "select u from UsuarioModuloReporte u where u.seudonimo = :seudonimo and u.contrasena = :pass";
            Query q = getEntityManager().createQuery(jpql);
            q.setParameter("seudonimo", getUsuario());
            q.setParameter("pass", EncriptadorSHA.encriptarBase64(getContrasena()));
            return (UsuarioModuloReporte) q.getSingleResult();
        }catch(NoResultException nre){
            nre.printStackTrace();
            return null;
        }catch(Exception e){
            throw  new Exception(e);
        }
    }
    
    public void validarSesion(){
        String paginaInvoca = FacesContext.getCurrentInstance().getExternalContext().getRequestServletPath();
        if(!paginaInvoca.contains("Inicio") && !isUsuarioEnSesion()){
            redireccionarPagina();
        }
        
    }
    
    public void redireccionarPagina() {
        try {
            System.out.println("Redireccionando a pagina de inicio");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            String ctxPath =
             ((ServletContext) context.getContext()).getContextPath();
            String urlPattern=JsfAyuda.getPropertyValueFromConfigurationFile("moduloUrlPatern");
            String redirect= "";
            if(urlPattern.startsWith("*")){
                redirect=ctxPath+"/principal/Inicio"+urlPattern.replace("*", "");
            }else if(urlPattern.endsWith("*")){
                redirect=ctxPath+urlPattern.replace("*", "")+"/principal/Inicio.xhtml";
            }
            context.redirect(redirect);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getContrasena() {
        return contrasena;
    }

    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    
    
    
}
